﻿// --------------------------------------------------------------------------------------------------------------------
// <copyright file="StopNetworkServiceExecutor.cs" company="DHGMS Solutions">
//   Copyright 2004-2014 DHGMS Solutions.
//      
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//      
//   http://www.apache.org/licenses/LICENSE-2.0
//      
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
// </copyright>
// <summary>
//   Defines the StopNetworkServiceExecutor type.
// </summary>
// --------------------------------------------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Dhgms.TplHelper.Model.NoResultExecutor
{
    using System.ServiceProcess;

    public class StopNetworkServiceExecutor : INoResultExecutor
    {
        private readonly string serviceName;

        private readonly string hostname;

        public StopNetworkServiceExecutor(string serviceName, string hostname)
        {
            this.serviceName = serviceName;
            this.hostname = hostname;
        }

        public System.Threading.Tasks.Task GetTask()
        {
            return TaskEx.Run(() => OnExecute());
        }

        private void OnExecute()
        {
            var sc = new ServiceController(this.serviceName, this.hostname);

            if (sc.Status == ServiceControllerStatus.Running ||
                sc.Status == ServiceControllerStatus.StartPending)
            {
                Console.WriteLine("Service is already running");
            }
            else
            {
                try
                {
                    Console.Write("Start pending... ");
                    sc.Start();
                    sc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 60));

                    if (sc.Status == ServiceControllerStatus.Running)
                    {
                        Console.WriteLine("Service started successfully.");
                    }
                    else
                    {
                        Console.WriteLine("Service not started.");
                        Console.WriteLine("  Current State: {0}", sc.Status.ToString("f"));
                    }
                }
                catch (InvalidOperationException)
                {
                    Console.WriteLine("Could not start the service.");
                }
            }
        }
    }
}
